package errors

// 错误码定义
const (
	// 系统错误 (1000-1999)
	ErrCodeSystem        = 1000 // 系统错误
	ErrCodeIO            = 1001 // IO错误
	ErrCodePermission    = 1002 // 权限错误
	ErrCodeNetwork       = 1003 // 网络错误
	ErrCodeTimeout       = 1004 // 超时错误
	ErrCodeResourceLimit = 1005 // 资源限制错误

	// 配置错误 (2000-2999)
	ErrCodeConfig        = 2000 // 配置错误
	ErrCodeInvalidParam  = 2001 // 无效参数
	ErrCodeMissingParam  = 2002 // 缺少参数
	ErrCodeInvalidFormat = 2003 // 格式错误
	ErrCodeValidation    = 2004 // 验证失败

	// Git错误 (3000-3999)
	ErrCodeGit         = 3000 // Git错误
	ErrCodeGitClone    = 3001 // 克隆失败
	ErrCodeGitCheckout = 3002 // 检出失败
	ErrCodeGitAuth     = 3003 // 认证失败
	ErrCodeGitNotFound = 3004 // 仓库不存在

	// 构建错误 (4000-4999)
	ErrCodeBuild        = 4000 // 构建错误
	ErrCodeBuildTool    = 4001 // 构建工具错误
	ErrCodeBuildDeps    = 4002 // 依赖错误
	ErrCodeBuildCompile = 4003 // 编译错误
	ErrCodeBuildTest    = 4004 // 测试失败
	ErrCodeBuildPackage = 4005 // 打包失败

	// Docker错误 (5000-5999)
	ErrCodeDocker        = 5000 // Docker错误
	ErrCodeDockerBuild   = 5001 // 镜像构建失败
	ErrCodeDockerPush    = 5002 // 镜像推送失败
	ErrCodeDockerPull    = 5003 // 镜像拉取失败
	ErrCodeDockerRun     = 5004 // 容器运行失败
	ErrCodeDockerNetwork = 5005 // 网络错误

	// 部署错误 (6000-6999)
	ErrCodeDeploy         = 6000 // 部署错误
	ErrCodeDeployCreate   = 6001 // 创建失败
	ErrCodeDeployUpdate   = 6002 // 更新失败
	ErrCodeDeployRollback = 6003 // 回滚失败
	ErrCodeDeployScale    = 6004 // 扩缩容失败

	// 健康检查错误 (7000-7999)
	ErrCodeHealth         = 7000 // 健康检查错误
	ErrCodeHealthTimeout  = 7001 // 健康检查超时
	ErrCodeHealthFailed   = 7002 // 健康检查失败
	ErrCodeHealthEndpoint = 7003 // 健康检查端点错误
)

// 错误码描述
var errorMessages = map[int]string{
	// 系统错误
	ErrCodeSystem:        "系统内部错误",
	ErrCodeIO:            "IO操作失败",
	ErrCodePermission:    "权限不足",
	ErrCodeNetwork:       "网络错误",
	ErrCodeTimeout:       "操作超时",
	ErrCodeResourceLimit: "资源限制错误",

	// 配置错误
	ErrCodeConfig:        "配置错误",
	ErrCodeInvalidParam:  "无效的参数",
	ErrCodeMissingParam:  "缺少必要参数",
	ErrCodeInvalidFormat: "格式错误",
	ErrCodeValidation:    "验证失败",

	// Git错误
	ErrCodeGit:         "Git操作失败",
	ErrCodeGitClone:    "代码克隆失败",
	ErrCodeGitCheckout: "分支检出失败",
	ErrCodeGitAuth:     "Git认证失败",
	ErrCodeGitNotFound: "Git仓库不存在",

	// 构建错误
	ErrCodeBuild:        "构建失败",
	ErrCodeBuildTool:    "构建工具错误",
	ErrCodeBuildDeps:    "依赖解析失败",
	ErrCodeBuildCompile: "编译失败",
	ErrCodeBuildTest:    "测试失败",
	ErrCodeBuildPackage: "打包失败",

	// Docker错误
	ErrCodeDocker:        "Docker操作失败",
	ErrCodeDockerBuild:   "Docker镜像构建失败",
	ErrCodeDockerPush:    "Docker镜像推送失败",
	ErrCodeDockerPull:    "Docker镜像拉取失败",
	ErrCodeDockerRun:     "Docker容器运行失败",
	ErrCodeDockerNetwork: "Docker网络错误",

	// 部署错误
	ErrCodeDeploy:         "部署失败",
	ErrCodeDeployCreate:   "服务创建失败",
	ErrCodeDeployUpdate:   "服务更新失败",
	ErrCodeDeployRollback: "服务回滚失败",
	ErrCodeDeployScale:    "服务扩缩容失败",

	// 健康检查错误
	ErrCodeHealth:         "健康检查失败",
	ErrCodeHealthTimeout:  "健康检查超时",
	ErrCodeHealthFailed:   "服务不健康",
	ErrCodeHealthEndpoint: "健康检查端点错误",
}

// 错误处理建议
var errorSuggestions = map[int]string{
	// 系统错误
	ErrCodeSystem:        "请检查系统日志并联系管理员",
	ErrCodeIO:            "请检查文件权限和磁盘空间",
	ErrCodePermission:    "请确认当前用户权限",
	ErrCodeNetwork:       "请检查网络连接和防火墙设置",
	ErrCodeTimeout:       "请检查系统负载或增加超时时间",
	ErrCodeResourceLimit: "请检查系统资源使用情况",

	// 配置错误
	ErrCodeConfig:        "请检查配置文件格式和内容",
	ErrCodeInvalidParam:  "请参考文档检查参数值",
	ErrCodeMissingParam:  "请提供所有必要参数",
	ErrCodeInvalidFormat: "请按照要求的格式提供配置",
	ErrCodeValidation:    "请根据验证错误信息修改配置",

	// Git错误
	ErrCodeGit:         "请检查Git配置和权限",
	ErrCodeGitClone:    "请确认仓库地址和访问权限",
	ErrCodeGitCheckout: "请确认分支名称是否正确",
	ErrCodeGitAuth:     "请检查SSH密钥配置",
	ErrCodeGitNotFound: "请确认仓库地址是否正确",

	// 构建错误
	ErrCodeBuild:        "请检查构建日志",
	ErrCodeBuildTool:    "请确认构建工具安装正确",
	ErrCodeBuildDeps:    "请检查依赖配置和网络连接",
	ErrCodeBuildCompile: "请检查编译错误信息",
	ErrCodeBuildTest:    "请检查测试失败原因",
	ErrCodeBuildPackage: "请检查打包配置",

	// Docker错误
	ErrCodeDocker:        "请检查Docker服务状态",
	ErrCodeDockerBuild:   "请检查Dockerfile和构建上下文",
	ErrCodeDockerPush:    "请检查镜像仓库配置和权限",
	ErrCodeDockerPull:    "请确认镜像名称和标签",
	ErrCodeDockerRun:     "请检查容器运行日志",
	ErrCodeDockerNetwork: "请检查Docker网络配置",

	// 部署错误
	ErrCodeDeploy:         "请检查部署配置",
	ErrCodeDeployCreate:   "请检查服务创建日志",
	ErrCodeDeployUpdate:   "请检查服务更新日志",
	ErrCodeDeployRollback: "请手动检查服务状态",
	ErrCodeDeployScale:    "请检查资源是否充足",

	// 健康检查错误
	ErrCodeHealth:         "请检查服务运行状态",
	ErrCodeHealthTimeout:  "请检查服务响应时间",
	ErrCodeHealthFailed:   "请检查服务日志",
	ErrCodeHealthEndpoint: "请确认健康检查配置",
}

// 获取错误描述
func GetErrorMessage(code int) string {
	if msg, ok := errorMessages[code]; ok {
		return msg
	}
	return "未知错误"
}

// 获取错误处理建议
func GetErrorSuggestion(code int) string {
	if suggestion, ok := errorSuggestions[code]; ok {
		return suggestion
	}
	return "请联系管理员处理"
}

// 创建带错误码的错误
func NewErrorWithCode(code int, message string) error {
	return &Error{
		Type:    GetErrorMessage(code),
		Message: message,
		Code:    code,
		Context: make(map[string]string),
	}
}

// 包装带错误码的错误
func WrapErrorWithCode(err error, code int, message string) error {
	return &Error{
		Type:    GetErrorMessage(code),
		Message: message,
		Code:    code,
		Cause:   err,
		Context: make(map[string]string),
	}
}

// 获取错误码
func GetErrorCode(err error) int {
	if e, ok := err.(*Error); ok {
		return e.Code
	}
	return ErrCodeSystem
}
